import pandas as pd
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取 Excel 文件
file_path = "门店销售占比及菜品类别分析.xlsx"
df = pd.read_excel(file_path, sheet_name="Sheet1")

# 按类别汇总销售占比
category_summary = df.groupby('主要菜品类别')['销售占比(%)'].sum().reset_index()

# 创建饼状图
plt.figure(figsize=(10, 8))
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
wedges, texts, autotexts = plt.pie(category_summary['销售占比(%)'],
                                   labels=category_summary['主要菜品类别'],
                                   autopct='%1.1f%%',
                                   colors=colors,
                                   startangle=90)

# 美化图表
plt.title('各菜品类别总销售占比分布', fontsize=16, fontweight='bold')
plt.axis('equal')  # 确保饼图是圆形

# 设置文字样式
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontweight('bold')

# 添加图例
plt.legend(wedges, category_summary['主要菜品类别'],
           title="菜品类别",
           loc="center left",
           bbox_to_anchor=(1, 0, 0.5, 1))

plt.tight_layout()
plt.show()

# 输出详细数据和建议
print("各菜品类别总销售占比：")
print(category_summary)
print("\n优化与淘汰建议：")

for _, row in category_summary.iterrows():
    category = row['主要菜品类别']
    total_percent = row['销售占比(%)']

    if total_percent > 20:
        print(f"✅ {category}: {total_percent:.1f}% - 表现优秀，可考虑推出新品")
    elif total_percent < 5:
        print(f"❌ {category}: {total_percent:.1f}% - 销售不佳，建议下架或优化")
    else:
        print(f"⚠️  {category}: {total_percent:.1f}% - 表现一般，需要关注")

import pandas as pd
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def generate_store_sales_pie(store_id):
    """
    根据销售记录生成指定门店内部各类菜品销售占比饼状图
    """
    try:
        # 读取销售记录数据
        sales_df = pd.read_excel("餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        store_info_df = pd.read_excel("餐饮连锁品牌数据_门店信息_cleaned.xlsx")
        dish_info_df = pd.read_excel("餐饮连锁品牌数据_菜品信息4_cleaned.xlsx")

        # 获取该门店的所有销售记录
        store_sales = sales_df[sales_df['门店ID'] == store_id]

        if store_sales.empty:
            print(f"错误: 未找到门店 {store_id} 的销售记录")
            return

        # 合并菜品信息，获取菜品类别
        store_sales_with_category = store_sales.merge(
            dish_info_df[['菜品ID', '菜品类别']],
            on='菜品ID',
            how='left'
        )

        # 按菜品类别统计销售数量
        category_sales = store_sales_with_category.groupby('菜品类别')['销售数量'].sum().reset_index()

        if category_sales.empty:
            print(f"错误: 门店 {store_id} 没有有效的销售记录")
            return

        # 获取门店信息
        store_info = store_info_df[store_info_df['门店ID'] == store_id]
        store_name = store_info['门店名称'].iloc[0] if not store_info.empty else store_id
        store_city = store_info['所在城市'].iloc[0] if not store_info.empty else ""

        # 计算各类别占比
        total_sales = category_sales['销售数量'].sum()
        category_sales['占比(%)'] = (category_sales['销售数量'] / total_sales) * 100

        # 创建饼状图
        plt.figure(figsize=(10, 8))
        colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD', '#98D8C8', '#FFB347']

        wedges, texts, autotexts = plt.pie(
            category_sales['占比(%)'],
            labels=category_sales['菜品类别'],
            autopct='%1.1f%%',
            colors=colors[:len(category_sales)],
            startangle=90,
            textprops={'fontsize': 11}
        )

        # 美化文字
        for autotext in autotexts:
            autotext.set_color('white')
            autotext.set_fontweight('bold')
            autotext.set_fontsize(10)

        plt.title(f'{store_id} {store_name}\n{store_city} - 各类菜品销售占比\n总销售数量: {total_sales}',
                  fontsize=14, fontweight='bold', pad=20)
        plt.axis('equal')
        plt.tight_layout()
        plt.show()

        # 输出详细数据
        print(f"\n{store_id} {store_name} ({store_city})")
        print("=" * 60)
        print("各类菜品销售占比详情:")
        for _, row in category_sales.iterrows():
            print(f"  {row['菜品类别']}: {row['占比(%)']:.1f}% (销售数量: {row['销售数量']})")
        print(f"总销售数量: {total_sales}")
        print("=" * 60)

    except FileNotFoundError as e:
        print(f"文件读取错误: {e}")
        print("请确保以下文件在当前目录中:")
        print("1. 餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        print("2. 餐饮连锁品牌数据_门店信息_cleaned.xlsx")
        print("3. 餐饮连锁品牌数据_菜品信息4_cleaned.xlsx")
    except Exception as e:
        print(f"生成图表时出错: {e}")


def show_all_stores():
    """
    显示所有有销售记录的门店列表
    """
    try:
        sales_df = pd.read_excel("餐饮连锁品牌数据_销售记录3_cleaned.xlsx")
        store_info_df = pd.read_excel("餐饮连锁品牌数据_门店信息_cleaned.xlsx")

        # 获取有销售记录的门店
        stores_with_sales = sales_df['门店ID'].unique()

        # 合并门店信息
        stores_info = store_info_df[store_info_df['门店ID'].isin(stores_with_sales)]

        print("有销售记录的门店ID:")
        print("-" * 50)
        for i, (_, row) in enumerate(stores_info.iterrows(), 1):
            print(f"{i:2d}. {row['门店ID']} - {row['门店名称']} ({row['所在城市']})")
        print("-" * 50)

    except FileNotFoundError:
        print("无法读取门店列表，请检查文件是否存在")


# 主程序
if __name__ == "__main__":
    # 显示有销售记录的门店列表
    show_all_stores()

    # 在这里修改门店ID来查看不同门店
    target_store = 'STO008'  # ← 修改这个门店ID

    print(f"\n正在生成门店 {target_store} 的销售占比饼状图...")
    generate_store_sales_pie(target_store)

    # 使用说明
    print("\n使用方法:")
    print("修改第 85 行的 target_store 变量来查看不同门店")
    print("例如: target_store = 'STO002'")